;*********************************************************** ; A/D変換動作チェックプログラム(3) ; A/D変換入力 3端子(CH0/RA0),(CH2/RA2),(CH3/RA3) ; A/D変換の結果は LED 点灯により確認 ; RB1(MSB),RB0,RD7,RD6,RD5,RD4,RD3,RD2,RD1,RD0(LSB) ; の10ビット ; 3入力の CH 判別は LED 点灯により確認 ; CH0 → RC0 を点灯 ; CH2 → RC2 を点灯 ; CH3 → RC3 を点灯 ; A/D 割り込みは使用せず、簡単のため GO ビットで判断 ;*********************************************************** LIST P=PIC16F877 ; プロセッサの種別指定 INCLUDE "P16F877.INC" ; インクルードファイルの指定 ;*********************************************************** ; 変数定義とレジスタ割付 ;*********************************************************** COUNT EQU 20H ; ループカウンタ COUNT1 EQU 21H ; ループカウンタ1 COUNT2 EQU 22H ; ループカウンタ2 COUNT3 EQU 23H ; ループカウンタ3 COUNT4 EQU 24H ; ループカウンタ4 PC_LOC EQU 25H ; ロケーションカウンタ ORG 0 ; プログラムの開始番地の指定 ;*********************************************************** ; 入出力ピン初期化 ;*********************************************************** BSF STATUS,RP0 ; Bank 1 へ切替 MOVLW B'10000010' ; RA0〜5アナログ、結果右詰 MOVWF ADCON1 ; ADCON1レジスタの設定 CLRF TRISB ; PortB 出力モードに設定 CLRF TRISC ; PortC 出力モードに設定 CLRF TRISD ; PortD 出力モードに設定 BCF STATUS,RP0 ; Bank 0 へ戻す ; MOVLW B'10000000' ; Fosc/32,CH0 設定, A/D off MOVWF ADCON0 ; ADCON0レジスタの設定 MOVLW B'10010000' ; Fosc/32,CH2 設定, A/D off MOVWF ADCON0 ; ADCON0レジスタの設定 MOVLW B'10011000' ; Fosc/32,CH3 設定, A/D off MOVWF ADCON0 ; ADCON0レジスタの設定 ; ;*********************************************************** ; メインプログラム ;*********************************************************** MAIN MOVLW 3 ; ロケーションカウンタの初期値 MOVWF PC_LOC ; ロケーションカウンタの設定 ADSTART MOVF PC_LOC,W ; ロケーションカウンタをWregにロードする CALL SELECT_LED ; CH 表示の判別サブルーチンへ MOVWF PORTC ; PortCへ CH 判別データを出力 ; MOVF PC_LOC,W ; ロケーションカウンタをWregにロードする CALL SELECT_AD ; CH 設定サブルーチンへ MOVWF ADCON0 ; ADCON0レジスタの設定 ; CALL TIME_ACQ ; 20μs 一定時間待つ(アクィジション時間) BSF ADCON0,GO ; A/D スタート WAIT ; A/D が完了すると GOが0になる BTFSC ADCON0,GO ; GO が 0 だったらループから抜ける GOTO WAIT ; GO が 1 だったら WAIT へループする MOVF ADRESH,W ; A/D データ上位(データは右詰) MOVWF PORTB ; PortBへ A/D 結果を出力 BSF STATUS,RP0 ; Bank 1 へ切替 MOVF ADRESL,W ; A/D データ下位 BCF STATUS,RP0 ; Bank 0 へ戻す MOVWF PORTD ; PortDへ A/D 結果を出力 CALL TIME1S ; 1秒間 表示 DECFSZ PC_LOC,F ; ロケーションカウンタ−1 GOTO ADSTART ; A/D 変換を繰り返す GOTO MAIN ; ロケーションカウンタ = 2, 1, 0, 2, 1, 0 ... ;*********************************************************** ; CH 表示の判別サブルーチン ;*********************************************************** SELECT_LED ADDWF PCL,F ; プログラムカウンタ+ロケーションカウンタ NOP ; ダミー行 RETLW B'00001000' ; CH3 表示のデータを Wregにロード RETLW B'00000100' ; CH2 表示のデータを Wregにロード RETLW B'00000001' ; CH0 表示のデータを Wregにロード ;*********************************************************** ;A/D CH設定のサブルーチン ;*********************************************************** SELECT_AD ADDWF PCL,F ; プログラムカウンタ+ロケーションカウンタ NOP ; ダミー行 RETLW B'10011001' ; Fosc/32,CH3 設定, A/D on を Wregにロード RETLW B'10010001' ; Fosc/32,CH2 設定, A/D on を Wregにロード RETLW B'10000001' ; Fosc/32,CH0 設定, A/D on を Wregにロード ;*********************************************************** ;遅延サブルーチン ;*********************************************************** ;アクィジション時間(20μs)の遅延サブルーチン(20MHzクロック時) TIME_ACQ MOVLW 20H ; 1サイクル 20H = 32 MOVWF COUNT ; 1サイクル NOP ; 1サイクル 微調整ダミー LOOP_ACQ DECFSZ COUNT,F ; 1×(32-1)+2 = 33サイクル GOTO LOOP_ACQ ; 2×(32-1) = 62サイクル RETURN ; 2サイクル ; 合計 100サイクル×0.2μs = 20μs ;100μs遅延サブルーチン(20MHzクロック時) TIME100 MOVLW 0A5H ; 1サイクル A5H=165 MOVWF COUNT ; 1サイクル NOP ; 1サイクル 微調整ダミー NOP ; 1サイクル 微調整ダミー LOOP DECFSZ COUNT,F ; 1×(165-1)+2 = 166サイクル GOTO LOOP ; 2×(165-1) = 328サイクル RETURN ; 2サイクル ;10ms遅延サブルーチン(20MHzクロック時) TIME10M MOVLW 63H ; 1サイクル 63H=99 MOVWF COUNT1 ; 1サイクル NOP ; 1サイクル 微調整ダミー NOP ; 1サイクル 微調整ダミー LOOP1 CALL TIME100 ; (2+500)×99=49698サイクル DECFSZ COUNT1,F ; 1×(99-1)+2 = 100サイクル GOTO LOOP1 ; 2×(99-1) = 196サイクル RETURN ; 2サイクル ;1s遅延サブルーチン(20MHzクロック時) TIME1S MOVLW 63H ; 1サイクル 63H=99 MOVWF COUNT2 ; 1サイクル MOVLW 62H ; 1サイクル 62H=98 MOVWF COUNT3 ; 1サイクル MOVLW 03H ; 1サイクル 03H=3 MOVWF COUNT4 ; 1サイクル NOP ; 1サイクル 微調整ダミー LOOP2 CALL TIME10M ;(2+50000)×99=4950198サイクル DECFSZ COUNT2,F ; 1×(99-1)+2 = 100サイクル GOTO LOOP2 ; 2×(99-1) = 196サイクル LOOP3 CALL TIME100 ;(2+500)×98=49196 DECFSZ COUNT3,F ; 1×(98-1)+2 = 99サイクル GOTO LOOP3 ; 2×(98-1) = 194サイクル LOOP4 DECFSZ COUNT4,F ; 1×(3-1)+2 = 4サイクル GOTO LOOP4 ; 2×(3-1) = 4サイクル RETURN ; 2サイクル END